﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using ReservaServices.Persistencia;
using ReservaServices.Dominio;
using System.Net;
using System.IO;
using System.Web.Script.Serialization;
using System.Messaging;

namespace ReservaServices
{
    public class ReservaService : IReservaService
    {
        private ReservaDAO reservaDAO = null;
        private ReservaDAO ReservaDAO
        {
            get
            {
                if (reservaDAO == null)
                    reservaDAO = new ReservaDAO();
                return reservaDAO;
            }
        }

        #region IReserva Members

        public String CrearReserva(Reserva reservaACrear)
        {
            String mensj = "";
            AreaComun areacomunresultado = null;

            // VALIDACION DE PAGO DE CUOTA MENSUAL
            int torre = reservaACrear.Torre;
            int dpto = reservaACrear.Dpto;
            CuotasMensualesWS.CuotasMensualesServiceClient proxy = new CuotasMensualesWS.CuotasMensualesServiceClient();
            CuotasMensualesWS.CuotaMensual cuotamensualresultado = proxy.ObtenerCuotaMensual(torre, dpto);

            if (cuotamensualresultado == null)
            {
                mensj = "El código del propietario no existe o no se encuentra al día en el pago de la cuota mensual";
            }
            else
            {
                // VALIDACION DE AREA COMUN
                string ruta = "http://localhost:20000/AreasComunesService.svc/AreasComunes/" + reservaACrear.IdAreaComun.ToString();
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(ruta);
                req.Method = "GET";
                var res = (HttpWebResponse)req.GetResponse();
                StreamReader reader = new StreamReader(res.GetResponseStream());
                string areaComunJson = reader.ReadToEnd();
                JavaScriptSerializer js = new JavaScriptSerializer();
                areacomunresultado = js.Deserialize<AreaComun>(areaComunJson);

                if (areacomunresultado == null)
                {
                    mensj = "El código de área común no existe";
                }
                else
                {
                    // VALIDACION DE LA RESERVA
                    if (ObtenerReserva(reservaACrear.Llave.ToString()) != null)
                    {
                        mensj = "El área común ya se encuentra reservada en esa hora";
                    }
                    else
                    {
                        if (reservaACrear.HoraInicio < 0 || reservaACrear.HoraInicio > 24)
                            mensj = "El formato horario es de 24 horas";
                    }
                }
            }

            if (mensj.Equals(""))
            {
                try
                {
                    // PREPARACION DE DATOS PARA ENCOLAR
                    PropietariosWS.PropietarioServiceClient proxy1 = new PropietariosWS.PropietarioServiceClient();
                    PropietariosWS.Propietario propietarioresultado = proxy1.ObtenerPropietario(torre, dpto);

                    reservaACrear.Llave = reservaACrear.Torre * 1000000 + reservaACrear.Dpto * 1000 + reservaACrear.IdAreaComun * 100 + reservaACrear.HoraInicio;
                    reservaACrear.Propietario = propietarioresultado.Nombre.Trim() + " " + propietarioresultado.Apellido.Trim();
                    reservaACrear.DesAreaComun = areacomunresultado.Descripcion;
                    reservaACrear.HoraFin = reservaACrear.HoraInicio + 1;
                    reservaACrear.Estado = "";

                    if (reservaACrear.HoraFin > 24)
                        reservaACrear.HoraFin = 0;

                    // ENVIANDO A LA COLA
                    string rutaCola = @".\private$\rkanashiro";
                    if (!MessageQueue.Exists(rutaCola))
                        MessageQueue.Create(rutaCola);
                    MessageQueue cola = new MessageQueue(rutaCola);
                    Message mensaje = new Message();
                    mensaje.Label = "Reserva";
                    mensaje.Body = reservaACrear;
                    cola.Send(mensaje);
                }
                catch
                {
                    mensj = "No se pudo registrar";
                }
            }

            return mensj;
        }

        public string CancelarReserva(string codigo)
        {
            try
            {
                Reserva reservaACancelar = ReservaDAO.Obtener(int.Parse(codigo));
                reservaACancelar.Estado = "CANCELADA";

                // ENVIANDO A LA COLA
                string rutaCola = @".\private$\rkanashiro";
                if (!MessageQueue.Exists(rutaCola))
                    MessageQueue.Create(rutaCola);
                MessageQueue cola = new MessageQueue(rutaCola);
                Message mensaje = new Message();
                mensaje.Label = "Reserva";
                mensaje.Body = reservaACancelar;
                cola.Send(mensaje);
                return "";
            }
            catch (Exception e)
            {
                return "No se pudo eliminar";
            }
        }

        public string RecibirMensajes()
        {
            string Msje = "";
            try
            {
                // RECIBIENDO DE LA COLA
                string rutaCola = @".\private$\rkanashiro";
                if (!MessageQueue.Exists(rutaCola))
                    MessageQueue.Create(rutaCola);
                MessageQueue cola = new MessageQueue(rutaCola);

                int cantidad = cola.GetAllMessages().Length;
                Message mensaje = null;
                Reserva reservaCola = null;
                for (int i = 0; i < cantidad; i++)
                {
                    cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(Reserva) });
                    mensaje = cola.Receive();
                    reservaCola = (Reserva)mensaje.Body;

                    if (reservaCola.Estado == "CANCELADA")
                    {
                        ReservaDAO.Modificar(reservaCola);
                    }
                    else
                    {
                        ReservaDAO.Crear(reservaCola);
                    }
                }
            }
            catch
            {
                Msje = "No todos los mensajes se actualizaron";
            }
            return Msje;
        }

        public Reserva ObtenerReserva(string llave)
        {
            return ReservaDAO.Obtener(int.Parse(llave));
        }

        public List<Reserva> ListarReservas()
        {
            return ReservaDAO.ListarTodos().ToList();
        }

        #endregion
    }
}
